package com.zhu.cmd;

public class Cmd {
    private boolean helpFlag;

    private boolean versionFlag;
    //用户指定的类路径
    private String classPath;;
    // 主类名
    private String mainClassName;
    // 传递给主类的参数
    private String[] args;
    //jre路径
    private String jrePath;

    public String getJrePath() {
        return jrePath;
    }

    public void setJrePath(String jrePath) {
        this.jrePath = jrePath;
    }

    private Cmd(boolean helpFlag, boolean versionFlag, String classPath, String mainClassName, String[] args,String jrePath) {
        this.helpFlag = helpFlag;
        this.versionFlag = versionFlag;
        this.classPath = classPath;
        this.mainClassName = mainClassName;
        this.args = args;
        this.jrePath=jrePath;
    }

    public boolean getHelpFlag() {
        return helpFlag;
    }

    public void setHelpFlag(boolean helpFlag) {
        this.helpFlag = helpFlag;
    }

    public boolean getVersionFlag() {
        return versionFlag;
    }

    public void setVersionFlag(boolean versionFlag) {
        this.versionFlag = versionFlag;
    }

    public String getClassPath() {
        return classPath;
    }

    public void setClassPath(String classPath) {
        this.classPath = classPath;
    }

    public String getMainClassName() {
        return mainClassName;
    }

    public void setMainClassName(String mainClassName) {
        this.mainClassName = mainClassName;
    }

    public String[] getArgs() {
        return args;
    }

    public void setArgs(String[] args) {
        this.args = args;
    }

    // 打印用法
    public static void printUsage() {
        System.out.println("Usage: java YourJVM [-options] class [args...]");
        System.out.println("where options include:");
        System.out.println("    -cp <path>  set classpath");
        System.out.println("    -help       print this help message");
        System.out.println("    -version    print version and exit");
    }

    //D:\computerBookCode\jvmByJava>java -cp out com.zhu.JvmByJavaMain -cp . com.zhu.TestMain arg1 arg2
    //java -cp out com.zhu.JvmByJavaMain 用真实jvm启动jvm模拟程序
    //-cp . com.zhu.TestMain arg1 arg2 这部分才是给你jvm模拟程序传入的参数
    //helpFlag:false
    //versionFlag:false
    //classPath:.
    //mainClassName:com.zhu.TestMain
    //args:[arg1, arg2]
    public static Cmd parseCmd(String[] args){
        Cmd cmd = new Cmd(false, false, "", "", new String[0],"");
        //java Main -cp /libs MyClass arg1 arg2 --->args = {"-cp", "/libs", "MyClass", "arg1", "arg2"}
        for (int i=0;i<args.length;i++){
            String arg = args[i];
            System.out.println("Current arg: '" + arg + "'");
            switch (arg){
                //因为java命令有个规则就是一旦解析到了-help选项立马退出后续命令行参数的解析
                case "-help":
                case "-?":
                    cmd.helpFlag=true;
                    return cmd;
                case "-version":
                    cmd.versionFlag=true;
                    return cmd;
                case "-cp":
                case "-classpath":
                    //java MyApp -cp 不合法 -cp是最后一个参数 没有下一个参数的时候 i=args.length-1
                    if (i < args.length-1) {
                        cmd.classPath = args[i + 1];
                        // 跳过下一个参数
                        i++;
                    } else {
                        System.err.println("missing argument for " + arg);
                        cmd.helpFlag = true;
                        return cmd;
                    }
                    break;
                case "-Xjre":
                    if (i  < args.length-1) {
                        // 下一个参数就是路径
                        cmd.jrePath = args[i+1];
                        i++;
                    } else {
                        // -Xjre 后面没路径，报错，显示帮助
                        System.err.println("missing argument for " + arg);
                        cmd.helpFlag = true;
                        return cmd;
                    }
                    break;
                default:
                    // 新增：检测未知选项
                    if (arg.startsWith("-")) {
                        System.err.println("Unknown option: " + arg);
                        cmd.helpFlag = true;
                        return cmd;
                    }
                    // 第一个不以 - 开头的参数 → 主类名
                    if (cmd.mainClassName.isEmpty()) {
                        cmd.mainClassName = arg;
                    } else {
                        // 主类名之后的所有参数 → 传给主类的 args
                        cmd.args = java.util.Arrays.copyOfRange(args, i, args.length);
                        //立即返回，不再继续解析
                        return cmd;
                    }
                    break;
            }
        }
        return cmd;
    }
}
